﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DMA.SGDB.BLL;
using DMA.SGDB.DAL;
using DMA.SGDB.Util;
using DMA.SGDB.Util.SGDBEnum;
using DMA.SGDB.Web.Shared;

namespace DMA.SGDB.Web
{
    public partial class TelaCadastroProdutos : System.Web.UI.Page
    {

        ProdutoBLL produtoBll;
        PRODUTO_IT produto;
        
        
        protected void Page_Load(object sender, EventArgs e)
        {
            pnlQuestion.Click += new EventHandler<Shared.CustomEventArgs.PainelYesNoUserEventArgs>(pnlQuestion_Click);

            if (!IsPostBack)
                SetMode(Crud.List);

            FillGridView();
        }

        public void FillGridView()
        {
            try
            {
                gvList.DataSource = new ProdutoBLL().GetAll();
                gvList.DataBind();

                GridViewManager.Configure(gvList, new ProdutoBLL().GetAll().Columns.Count + 2, new int[] { 1 });
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void SetMode(Crud crud)
        {
            Session["Mode"] = crud;
            ToolBar(crud);
        }

        public void ToolBar(Crud crud)
        {
            switch (crud)
            {
                case Crud.List:
                    divBtnNew.Visible = true;
                    divBtnSave.Visible = false;
                    divBtnCancel.Visible = false;
                    divBtnBack.Visible = false;
                    break;
                case Crud.New:
                    divBtnNew.Visible = false;
                    divBtnSave.Visible = true;
                    divBtnCancel.Visible = true;
                    divBtnBack.Visible = false;
                    break;
                case Crud.Edit:
                    divBtnNew.Visible = false;
                    divBtnSave.Visible = true;
                    divBtnCancel.Visible = true;
                    divBtnBack.Visible = false;
                    break;
                case Crud.View:
                    divBtnNew.Visible = false;
                    divBtnSave.Visible = false;
                    divBtnCancel.Visible = false;
                    divBtnBack.Visible = true;
                    break;
            }
        }

        public Crud GetMode()
        {
            return (Crud)Session["Mode"];
        }

        public void SetId(int idCommand)
        {
            Session["ID"] = idCommand;
        }

        public int GetID()
        {
            return (int)Session["ID"];
        }

        protected void imgBtnNew_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                SetMode(Crud.New);
                ShowScreenRegister();
                ClearAllFields(pnlRegister);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        protected void imgBtnSave_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                Save();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        protected void imgBtnCancel_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                RehabilitateFields();
                ShowScreenList();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        
        protected void btnCalcular_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(txtGain.Text) && !string.IsNullOrEmpty(txtCostPrice.Text))
                txtPrecoVenda.Text = Convert.ToString(Convert.ToSingle(txtCostPrice.Text) * (1 + (0.01 * Convert.ToSingle(txtGain.Text))));
            else
            {
                List<String> errosList = new List<string>();

                pnlErros.TypeMessage = Shared.UserControl.TypeMessage.Error;
                pnlErros.Message = "Erro:";
                
                errosList.Add("Favor preencher os campos 'Preço de custo' e 'Lucro pretendido' para calcular o preço de venda.");
                txtPrecoVenda.Text = string.Empty;

                pnlErros.ErrorList = errosList;
                pnlErros.ShowPainelErrors();
            }
        }

        protected void btnEnviar_Click(object sender, EventArgs e)
        {
            Save();
            Response.Write("Produto cadastrado com sucesso!");
        }

        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            txtCostPrice.Text = "";
            txtDescricao.Text = "";
            txtGain.Text = "";
            txtName.Text = "";
            txtPrecoVenda.Text = "";
            txtQuantConteudo.Text = "";
            txtQuantEstoque.Text = "";
            txtUnidade.Text = "";
        }

        protected void Save()
        {
            try
            {
                SetValuesDBConfig();

                //bool errorExist = GetValidationErrorMessages(dbConfig);

                //if (errorExist == false)
                //{
                    if (Crud.New.Equals(GetMode()))
                    {
                        produtoBll = new ProdutoBLL();
                        produtoBll.Insert(produto);

                    }
                    if (Crud.Edit.Equals(GetMode()))
                    {
                        produtoBll = new ProdutoBLL();
                        produtoBll.Update(produto);
                    }

                    FillGridView();
                    ShowScreenList();
                //}

            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        public void SetValuesDBConfig()
        {
            produto = new PRODUTO_IT();

            if(GetMode().Equals(Crud.Edit))
                produto.COD_PRO = GetID();

            produto.NOME_PRO = txtName.Text;
            produto.PRECO_PRO = float.Parse(txtCostPrice.Text);
            produto.LUCRO_PRO = float.Parse(txtGain.Text);
            produto.DESCR_PRO = txtDescricao.Text;
            produto.UNI_MED_PRO = txtUnidade.Text;
            produto.QUANT_MED_PRO = float.Parse(txtQuantConteudo.Text);
            produto.QUANT_PRO = float.Parse(txtQuantEstoque.Text);
            produto.PRECO_VENDA_PRO = float.Parse(txtPrecoVenda.Text);
            produto.QUANT_MIN_PRO = float.Parse(txtEstoqueMin.Text);
        }

        protected void imgBtnEdit_Click(object sender, EventArgs e)
        {
            try
            {
                SetMode(Crud.Edit);

                ShowScreenRegister();

                txtName.Focus();

                ImageButton img = (ImageButton)sender;
                GridViewRow row = (GridViewRow)img.Parent.Parent;

                int idRecordSelected = int.Parse(row.Cells[1].Text);

                SetId(idRecordSelected);

                PopulateFieldsWithDataDbconfig(idRecordSelected);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        protected void imgBtnVisualize_Click(object sender, EventArgs e)
        {
            try
            {
                SetMode(Crud.View);

                ShowScreenRegister();

                imgBtnSave.Visible = false;
                imgBtnCancel.Visible = false;
                imgBtnBack.Visible = true;

                ImageButton img = (ImageButton)sender;
                GridViewRow row = (GridViewRow)img.Parent.Parent;

                var idRecordSelected = row.Cells[1].Text;

                SetId(int.Parse(idRecordSelected));

                PopulateFieldsWithDataDbconfig(int.Parse(idRecordSelected));

                MakeFieldsReadOnly();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        protected void imgBtnDelete_Click(object sender, EventArgs e)
        {
            try
            {
                ImageButton img = (ImageButton)sender;
                GridViewRow row = (GridViewRow)img.Parent.Parent;

                divBtnNew.Visible = false;
                pnlList.Visible = false;                

                pnlQuestion.Value = row.Cells[1].Text;
                pnlQuestion.Message = "Confirma a exclusão do Produto " + row.Cells[2].Text + "?";
                pnlQuestion.ShowPainelQuestion();                
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        void pnlQuestion_Click(object sender, Shared.CustomEventArgs.PainelYesNoUserEventArgs e)
        {
            try
            {
                if (e.Result == Shared.CustomEventArgs.Result.Yes)
                {
                    produtoBll = new ProdutoBLL();

                    produtoBll.Delete(int.Parse(e.Value.ToString()));

                    FillGridView();
                    ShowScreenList();
                }

                divBtnNew.Visible = true;
                pnlList.Visible = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void PopulateFieldsWithDataDbconfig(int idRecordSelected)
        {
            try
            {
                produtoBll = new ProdutoBLL();
                produto = new PRODUTO_IT();

                produto = produtoBll.LoadById(idRecordSelected);

                txtName.Text = produto.NOME_PRO;
                txtCostPrice.Text = produto.PRECO_PRO.ToString();
                txtGain.Text = produto.LUCRO_PRO.ToString();
                txtDescricao.Text = produto.DESCR_PRO;
                txtUnidade.Text = produto.UNI_MED_PRO;
                txtQuantConteudo.Text = produto.QUANT_MED_PRO.ToString();
                txtQuantEstoque.Text = produto.QUANT_PRO.ToString();
                txtPrecoVenda.Text = produto.PRECO_VENDA_PRO.ToString();
                txtEstoqueMin.Text = produto.QUANT_MIN_PRO.ToString();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void MakeFieldsReadOnly()
        {
            txtName.ReadOnly = true;
            txtCostPrice.ReadOnly = true;
            txtGain.ReadOnly = true;
            txtDescricao.ReadOnly = true;
            txtUnidade.ReadOnly = true;
            txtQuantConteudo.ReadOnly = true;
            txtQuantEstoque.ReadOnly = true;
            txtPrecoVenda.ReadOnly = true;
            txtEstoqueMin.ReadOnly = true;
            btncalcular.Enabled = false;
        }

        public void RehabilitateFields()
        {
            txtName.ReadOnly = false;
            txtCostPrice.ReadOnly = false;
            txtGain.ReadOnly = false;
            txtDescricao.ReadOnly = false;
            txtUnidade.ReadOnly = false;
            txtQuantConteudo.ReadOnly = false;
            txtQuantEstoque.ReadOnly = false;
            txtPrecoVenda.ReadOnly = false;
            txtEstoqueMin.ReadOnly = false;
            btncalcular.Enabled = true;
        }


        protected void gvList_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
                gvList.PageIndex = e.NewPageIndex;
                FillGridView();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void ShowScreenRegister()
        {
            pnlList.Visible = false;
            pnlRegister.Visible = true;
        }

        public void ShowScreenList()
        {
            SetMode(Crud.List);
            pnlList.Visible = true;
            pnlRegister.Visible = false;
        }

        public void ClearAllFields(System.Web.UI.Control controle)
        {
            foreach (System.Web.UI.Control ctle in controle.Controls)
            {
                if (ctle is System.Web.UI.WebControls.TextBox)
                {
                    ((System.Web.UI.WebControls.TextBox)ctle).Text = string.Empty;
                }
                else if (ctle is DropDownList)
                {
                    ((DropDownList)ctle).SelectedValue = "-1";
                }
                else if (ctle is CheckBoxList)
                {
                    foreach (ListItem checkBox in ((CheckBoxList)ctle).Items)
                    {
                        checkBox.Selected = false;
                    }
                }
                else if (ctle is CheckBox)
                {
                    ((CheckBox)ctle).Checked = false;
                }
                else if (ctle.Controls.Count > 0)
                {
                    ClearAllFields(ctle);
                }
            }
        }
        protected void gvList_Sorting(object sender, GridViewSortEventArgs e)
        {
            FillGridView();
        }

        protected void gvList_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

    }
}